package com.zkh.myutils.scheduled;

import java.util.LinkedList;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

/**
 * 任务执行器
 */
public class ScheduledExecutor {
	/**
	 * 定时任务
	 */
	private static ScheduledExecutorService timerService = Executors.newScheduledThreadPool(10);
	/**
	 * 任务列表，用来确定任务是否全部取消
	 */
	private final static LinkedList<ScheduledFuture<?>> futureList = new LinkedList<>();
	
	/**
	 * 添加一个定时任务
	 * @param runnable 具体执行内容
	 * @param delay 延迟时间（毫秒）
	 * @param period 执行间隔（毫秒）
	 */
	public synchronized static ScheduledFuture<?> addTask(Runnable runnable, long delay, long period) {
		//初始化定时任务并保存
		futureList.add(timerService.scheduleAtFixedRate(runnable, delay, period, TimeUnit.MILLISECONDS));
		//返回
		return futureList.getLast();
	}
	
	/**
	 * 如果所有任务处于取消状态，则关闭
	 */
	public static void shutdownIfAllCancelled() {
		shutdownIfAllCancelled(0);
	}
		
	/**
	 * 如果所有任务处于取消状态，则关闭
	 * @param initSize 初始化线程池大小。如果参数大于0，则以该参数大小初始化线程池
	 */
	public synchronized static void shutdownIfAllCancelled(int initSize) {
		//遍历
		for(ScheduledFuture<?> future: futureList) {
			//没有取消，则结束，不执行终止操作
			if(!future.isCancelled()) {
				return;
			}
		}
		//执行终止操作
		timerService.shutdown();
		futureList.clear();
		//初始化
		if(initSize>0) {
			timerService = Executors.newScheduledThreadPool(initSize);
		}
	}
}